Range and endurance have been mentioned in the preceding sections - and we have introduced that for maximum range the pilot should fly at \(V_{md}\), whilst to fly for maximum endurance the pilot should fly at \(V_{mp}\).
However - the above speeds are valid only for unpowered flight. So these speeds are suitable for a glider, but once an engine is introduced to an aircraft, these speeds no longer give the maximum range or the maximum endurance.
Furthermore, the propulsor type changes the speeds for both. In the following section, the best range and endurance speeds for jet and propeller-driven aircraft will be explored.
Range and Endurance¶
Range and endurance are intuitive concepts:
Range (\(R\)): The maximum horizontal distance that an aircraft can cover.
Endurance (\(E\)): The time an aircraft can remain in flight
In the following analysis, the range and endurance for certain fuel quantities will be determined. For (hopefully) obvious reasons, some further definitions of range will help us here
Range subdefinitions¶
Safe Range: The maximum distance between two airfields, for which an aircraft can fly a safe a reliable mission with a given payload.
This is an involved calculation involving take-off/landing/weather/diversion allowances etc. - there isn’t an easy means to do this calculation, so tends to be performed computationally.
For aircraft performance there are some more simple definitions of range:
Still Air Range (SAR): The maximum distance possible if an aircraft takes off, climbs to cruise altitude, and then cruises until all fuel is expended.
Obviously not desirable to run out of fuel at altitude, but SAR gives a good indication of the influence of aircraft parameters on range.
Gross Still Air Range (GSAR): The maximum distance possible if an aircraft commences cruise at altitude and continues until all fuel is expended.
The relationship between SAR and GSAR tends to be easy to define.
GSAR much easier to calculate
What will be covered here
Defining the problem¶
To calculate GSAR, you might think that we need to:
find out the fuel flow rate, \(\dot{m}_{fuel}\) for thrust/power associated with \(V_{md}\)
get the endurance from the fuel mass, \(m_{fuel}\) divided by the flow rate \(E=\frac{m_{fuel}}{\dot{m}_{fuel}}\)
hence \(R=E\cdot V_{md}\)
The above reasoning is effectively how range is determined, but there are some complications that you may/may not be considering:
Aircraft take-off with a lot of fuel, so the aircraft weight changes with time and accordingly so do almost all the parameters we have considered up to this point
This means that some trade-offs have to be made in efficiency to allow a reasonable cruise - and we will see these
Breguet Range Equation¶
The Breguet Range Equation (BRE) is named after a French aircraft designer, but was actually derived in the 1920’s by J G Coffin.
History and namesakes…
I’ve loosely read the history of the BRE and it being Coffin who actually came up with it in NACA Report 1969, but I’ve never actually delved into the legacy of this equation. If you wish to, and suggest a correct here, feel free.
The BRE allows a simple means to calculate GSAR, and can be defined in words as:
A parameter, \(f\), is introduced which is:
Thrust Specific Fuel Consumption (TSFC) for a turbojet \(f\) - Mass of fuel burned per unit of thrust per second
Specific Fuel Consumption (SFC) for a turboprop \(f\) - Mass of fuel burned per unit of power per second
The analysis is slightly different for jet and propeller-driven aircraft, so jet aircraft will be explored first.
BRE - Jet Aircraft¶
With \(f\) defined as the mass of fuel burned per unit of thrust per second, the SI units are \(\frac{\text{kg}}{\text{N}\cdot\text{s}}\), and these are what you must use in equation form (if you’re using SI units), but \(f\) can be defined in other units such as \(\frac{\text{kg}}{\text{kN}\cdot\text{hr}}\) so you must remember to convert.
The BRE for a jet aircraft is:
which can be rearranged for the time
since the endurance/range is defined by cruise conditions, the equilibrium steady flight conditions of \(T=D\) and \(L=W\) can be utilised such that
which can be substituted into the BRE to give
for constant lift-to-drag ratio and TSFC, the equation above can be integrated with the limits \(t_{end}\) and \(t_{start}\) corresponding to \(W_{end}\) and \(W_{start}\). This yields the endurance, \(E\):
Jet Aircraft: Maximum Endurance¶
For a given \(f\) and \(W_{start}\), Equation (7) shows that the best endurance for a jet aircraft is found at the minimum drag speed .
To find the range, the equation above needs to be modified - the range is given by the following if it is assumed TAS remains constant
What maximises range?¶
The equation above gives the design/mission choices that help maximise range:
How is the BRE utilised?¶
In the Breguet Range Equation, Equation (8), some parameters are dictated by the problem:
\(W_{start}\) is the weight of the aircraft including fuel
\(W_{end}\) is the weight of the aircraft with no fuel, or with a certain mandated reserve
\(f\) is the TSFC and will generally be given in a problem
\(g\) is accleration due to gravity, and since you’re an aerospace engineer you should use \(g=9.80665\frac{\text{m}}{\text{s}^{2}}\)
Other parameters are unknown - so \(V\), \(C_L\), and \(C_D\) need to be constrained (defined in terms of other parameters) in order to use Equation (8) to determine the possible range.
In each of these cases, the range function is replaced with something else.
The ‘range function’ is the expression \(V\frac{C_L}{C_D}\) and clearly maximum range is given by the maximum value thereof.
In practice, this means replacing \(V\frac{C_L}{C_D}\) with an equivalent expression representing the variation of the parameters therein, by finding another means of representing \(V\) as a function of \(C_L\) or \(C_D\).
Three different means of doing this will be explored - first the theory will be explained, and then numerical examples will follow.
Most Efficient - Cruise Climb¶
The most aerodynamically efficient cruise would be with constant best \(C_L/C_D\), and constant \(f\). These have some implications. Have a look at these in the dropdown below:
Implication of the most efficient cruise
Above, it was stipulated that the lift-to-drag ratio (\(C_L/C_D\)), TSFC \(f\), and \(V_{T}\) were constant. These assumptions have some implications:
Fuel burn causes a reduction in aircraft weight - so as \(W\) drops, the dimensional value of lift, \(L\), must also drop (\(L=W\))
Since TAS is constant, for \(L\) to drop, either \(C_L\) must drop or \(\sigma\) must reduce
But it was also assumed that the aircraft flies at the best aerodynamic efficiency, and that \(C_L/C_D\) was constant, which implies a constant angle of attack
Therefore, \(\sigma\) must reduce, and hence altitude must increase for an efficient cruise
As \(C_L\) reduces, for constant \(C_L/C_D\), \(C_D\) must reduce in proportion to \(\sigma\) also
Since \(T=D\), the thrust must reduce with altitude
For constant TSFC, \(f\), the throttle setting must be constant
Hence thrust must be modelled from \(T=T_{SL}\cdot\sigma^n\) with \(n=1\)
As discussed previously, \(n\) is dependent on altitude and engine type - and the thrust model above is a vast simplification anyway
\(n=1\) is more suitable in the stratosphere (above 11km-ish), where the temperature falls with altitude (slightly more complicated than this, but it works enough for us).
Below 11km, in the troposphere, the temperature falls with altitude - and hence \(n<1\), so thrust falls less rapidly with altitude. To maintain constant \(C_L/C_D\) requires the pilot to reduce the throttle to maintain \(V\) or \(C_L\), which would change the TSFC
The derivation has arrived at the so-called cruise-climb case, whereby the aircraft altitude rises along the cruise to maintain peak aerodynamic efficiency. This is infrequently allowed by air traffic control - but aircraft often follow a stepped-climb, which is a planned series of altitude changes to allow some of the benefits.
Further to the above, two cruise-climb cases can be explored:
Throttle Restricted - The throttle setting is fixed, and the aircraft must vary altitude to maintain constant \(C_L/C_D\)
Throttle Unrestricted - The throttle can be altered to maintain constant \(C_L/C_D\)
Cruise-Climb 1: Throttle Restricted¶
‘Throttle-restricted’ means that the throttle is kept constant, and the maximum range therefore depends on the variation of thrust with altitude, hence:
\(T=T_{sl}\cdot\sigma\)
Since the variation of altitude is unknown, \(T=D\) will be used to develop an expression for \(V\) that does not contain \(\sigma\):
from the definition of the drag coefficient
and hence velocity can be represented in terms of constants and the drag coefficient
so the range function becomes
So for maximum range for throttle restricted cruise climb \(\frac{C_L}{C_D^{3/2}}\) must be maximised. In practice it is easier to minimise the reciprocal - inserting the drag equation:
via the quotient rule
which has a maximum at
hence defining the lift and drag coefficients for Throttle-Restricted Cruise-Climb as:
you can see that the aerodynamic coefficients above are defined in terms of constants - so these can be determined from design characteristics. Once these are determined, they are substituted into the range function, Equation (9), which is in turn substituted into the BRE Equation (8) - then this is integrated to yield the range.
Cruise-Climb 2: Throttle Unrestricted¶
If the throttle can change to maximise aerodynamic efficiency, then the velocity can remain constant. Hence \(V\) is defined by the start altitude and weight. In this case, the Aircraft Speed Equation (5) can be used to set \(V\):
So for maximum range for throttle unrestricted cruise-climb, we need to find cruise \(C_L\) such that \(\frac{C_L^{\tfrac{1}{2}}}{C_D}\) is a maximum:
max range given at the minima of this equation
the above \(C_L\) and \(C_D\) are used as before the find the maximum range.
Constant Altitude Cruise¶
Instead of cruise-climb, a constant altitude cruise allows the velocity to vary - the range will obviously be different.
Starting again with the the differential range expression where \(dS\) is the differential displacement:
Since \(\sigma\) is held constant, the aircraft speed equation can be substituted in the above
Note that for the maximum range, \(\frac{C_L^{1/2}}{C_D}\) must be maximised - which is the same as for the thrust unrestricted cruise-climb case.
For this case, altitude and \(C_L\) are held constant. As \(W\) reduces, \(L\) reduces, so \(V\) must reduce. Hence the range must be less as the aircraft is flying slower from \(t>0\).
Since \(C_D\) is constant, \(D\) and hence \(T\) must reduce - so throttle must be reduced and a variation in the fuel consumption will occur.
For this case, an average value of \(f\) must be used, or treat as a series of shorter steps and integrate numerically.
Actual Cruise¶
A third, and much more common cruise profile is to cruise at a constant altitude, at a constant \(V\). Hence to reduce \(L\) to match the reduction in weight, \(\alpha\) must be reduced, changing \(C_L/C_D\). This is a more complex analysis and beyond the scope of this course.
Cruise Comparisons¶
For an aircraft with the following parameters:
\(W_S\) |
100kN |
\(W_F\) |
60kN |
\(S\) |
50m\(^2\) |
\(C_{D0}\) |
0.02 |
\(K\) |
0.05 |
\(T_{SL}\) |
20kN |
\(f\) |
0.0001kg/Ns |
For a cruise starting at 12km altitude, the three different cruise ranges can be calculated
The code below calculates the different cruise-climb cases - note that these calculations could easily be performed by hand.
import numpy as np
from myst_nb import glue
from ambiance import Atmosphere
# Aircraft parameters
Ws = 100*1e3
We = 60*1e3
S = 50
CD0 = 0.02
K = 0.05
T_sl = 20*1e3
f = 0.0001
alt = 12 # altitude in km
g = 9.80665 # Gravitational acceleration
rho_sl = 1.225
############################################
## Thrust restricted cruise-climb parameters
############################################
CL_trcc = np.sqrt(CD0/2/K)
CD_trcc = 3/2 * CD0
range_function_trcc = np.sqrt(2 * T_sl / rho_sl / S) * CL_trcc / CD_trcc ** (3/2)
range_trcc = 1 / f / g * range_function_trcc * np.log(Ws/We)
# Save these values
glue("CD_trcc", CD_trcc, display=False);
glue("CL_trcc", CL_trcc, display=False);
glue("range_function_trcc", range_function_trcc, display=False);
glue("range_trcc", range_trcc/1e3, display=False);
############################################
## Thrust unrestricted cruise-climb parameters
############################################
mosphere = Atmosphere(alt*1000)
rho = mosphere.density[0]
sig_1 = rho/rho_sl
CL_tucc = np.sqrt(CD0/3/K)
CD_tucc = 4/3 * CD0
range_function_tucc = np.sqrt(Ws / (0.5 * sig_1 * rho_sl * S)) * CL_tucc ** .5 / CD_tucc
range_tucc = 1 / f / g * range_function_tucc * np.log(Ws/We)
# Save these values
glue("CD_tucc", CD_tucc, display=False);
glue("CL_tucc", CL_tucc, display=False);
glue("range_function_tucc", range_function_tucc, display=False);
glue("range_tucc", range_tucc/1e3, display=False);
Thrust Restricted¶
Using the expressions derived above, the lift coefficient for Thrust restricted cruise climb is 0.447, and the drag coefficient is 0.030. This gives the range function as 2199.430 which yields a range of 1146km
Thrust Unrestricted¶
Using the expressions derived above, the lift coefficient for Thrust unrestricted cruise climb is 0.365, and the drag coefficient is 0.027. This gives the range function as 2566.033 which yields a range of 1337km
Variation of jet range with lift coefficient, airspeed¶
Recall that the lift coefficient is effectively a measure of the aircraft cruise speed. The range can be plotted vs. lift coefficient and forward speed for the two different cruise-climb cases over a range of starting altitudes.
Beware of source for the plots below…
Producing the plots below is fairly simple - but in order to get the labels and legend to work correctly, there’s a bit of obscure logic flow in the way the plot is created.
That is, it makes it look more complicated than it actually is (and it probably could be done better if I knew my way around plotly better).
import plotly.graph_objects as go
## Note that there's a lot of slightly peculiar logic in the code below that enables the annotation and the legend
# to to be printed. You don't need to worry about it.
# Define a range of Cls
CLrange = np.linspace(.1, 1.2, 1000)
# Drag is given from the drag model
CDrange = CD0 + K * CLrange**2
# The CL and CD for TRCC and TUCC are defined above, so they can be reused here
# Open three figures
fig = go.Figure()
fig2 = go.Figure()
fig3 = go.Figure()
# Make sigma function for convenience
def sigma_function(alt):
mosphere = Atmosphere(alt)
rho = mosphere.density[0]
sig = rho/rho_sl
return sig
# Iterate over altitudes
for i, h in enumerate(np.arange(4, 14, 2)*1e3):
# Get the density ratio
sig = sigma_function(h)
# Determine the cruise speed in TAS at this altitude
Vtas_knots = np.sqrt(Ws / (.5 * sig * rho_sl * S * CLrange)) /.5144444
Veas_knots = np.sqrt(Ws / (.5 * rho_sl * S * CLrange)) /.5144444
######## Thrust Restricted
# Get the range function (thrust restricted)
range_funct_trcc = np.sqrt(2 * T_sl / (rho_sl * S)) * CLrange / CDrange ** (3/2)
# Get the range for this altitude
R_trcc = 1 / f / g * range_funct_trcc * np.log(Ws/We) / 1e3
# Plot it
if i == 0:
fig.add_trace(go.Scatter(x=CLrange, y=R_trcc, mode="lines", name=f"Thrust-Restricted", line=dict(width=4,
dash='dash', color='red')))
fig2.add_trace(go.Scatter(x=Veas_knots, y=R_trcc, mode="lines", name=f"Thrust-Restricted", line=dict(width=4,
dash='dash', color='red')))
fig3.add_trace(go.Scatter(x=Vtas_knots, y=R_trcc, mode="lines", name=f"Thrust-Restricted", line=dict(width=4,
dash='dash', color='red')))
else:
fig.add_trace(go.Scatter(x=CLrange, y=R_trcc, mode="lines", name="DontPrint", line=dict(width=4,
dash='dash', color='red')))
fig2.add_trace(go.Scatter(x=Veas_knots, y=R_trcc, mode="lines", name="DontPrint", line=dict(width=4,
dash='dash', color='red')))
fig3.add_trace(go.Scatter(x=Vtas_knots, y=R_trcc, mode="lines", name="DontPrint", line=dict(width=4,
dash='dash', color='red')))
######## Thrust Unrestricted
# Get the range function (thrust unrestricted)
range_funct_tucc = np.sqrt(Ws / (0.5 * sig * rho_sl * S)) * CLrange ** .5 / CDrange
# Get the range for this altitude
R_tucc = 1 / f / g * range_funct_tucc * np.log(Ws/We) / 1e3
# Plot it
if i == 0:
fig.add_trace(go.Scatter(x=CLrange, y=R_tucc, mode="lines", name="Thrust-Unrestricted", line=dict(width=4, color='blue')))
fig2.add_trace(go.Scatter(x=Veas_knots, y=R_tucc, mode="lines", name="Thrust-Unrestricted", line=dict(width=4, color='blue')))
fig3.add_trace(go.Scatter(x=Vtas_knots, y=R_tucc, mode="lines", name="Thrust-Unrestricted", line=dict(width=4, color='blue')))
else:
fig.add_trace(go.Scatter(x=CLrange, y=R_tucc, mode="lines", name="DontPrint", line=dict(width=4, color='blue')))
fig2.add_trace(go.Scatter(x=Veas_knots, y=R_tucc, mode="lines", name="DontPrint", line=dict(width=4, color='blue')))
fig3.add_trace(go.Scatter(x=Vtas_knots, y=R_tucc, mode="lines", name="DontPrint", line=dict(width=4, color='blue')))
######## Label the altitudes:
if i == 0: fig.add_trace(go.Scatter(x=[CLrange[0]], y=[R_trcc[0]], mode="text", text="All altitudes", textposition="middle right", name="Annotation"))
fig.add_trace(go.Scatter(x=[CLrange[0]], y=[R_tucc[0]], mode="text", text=f"{h/1e3:1.0f}km", textposition="middle left", name="DontPrint"))
if i == 0: fig2.add_trace(go.Scatter(x=[Veas_knots[0]+16*i + 2], y=[R_trcc[0]], mode="text", text="All altitudes", textposition="middle right", name="Annotation"))
fig2.add_trace(go.Scatter(x=[Veas_knots[0]+2], y=[R_tucc[0]], mode="text", text=f"{h/1e3:1.0f}km", textposition="middle right", name="Annotation"))
fig3.add_trace(go.Scatter(x=[Vtas_knots[0]], y=[R_tucc[0]], mode="text", text=f"{h/1e3:1.0f}km", textposition="bottom center", name="Annotation"))
fig3.add_trace(go.Scatter(x=[Vtas_knots[0]], y=[R_trcc[0]], mode="text", text=f"{h/1e3:1.0f}km", textposition="bottom center", name="Annotation"))
# Determine the different Cls to plot for comparison
CL_trcc = np.sqrt(CD0/2/K)
CL_tucc = np.sqrt(CD0/3/K)
CL_md = np.sqrt(CD0/K)
CL_mp = np.sqrt(3*CD0/K)
# Overlay lines for different Cls on the first figure only
fig.add_trace(go.Scatter(x=[CL_trcc, CL_trcc], y=[400, 1500], name="DontPrint", mode="lines", line=dict(color="crimson")))
fig.add_trace(go.Scatter(x=[CL_tucc, CL_tucc], y=[400, 1500], name="DontPrint", mode="lines", line=dict(color="darkgreen")))
fig.add_trace(go.Scatter(x=[CL_md, CL_md], y=[400, 1500], name="DontPrint", mode="lines", line=dict(color="mediumpurple")))
fig.add_trace(go.Scatter(x=[CL_mp, CL_mp], y=[400, 1500], name="DontPrint", mode="lines", line=dict(color="gold")))
fig.add_trace(go.Scatter(x=[CL_trcc], y=[200], mode="text",\
text="$C_{L,trcc}=\sqrt{\\frac{C_{D0}}{2\,K}}$",\
textposition="bottom center", name="DontPrint",\
textfont=dict(color="crimson")))
fig.add_trace(go.Scatter(x=[CL_tucc], y=[300], mode="text",\
text="$C_{L,tucc}=\sqrt{\\frac{C_{D0}}{3\,K}}$",\
textposition="bottom center", name="DontPrint",\
textfont=dict(color="darkgreen")))
fig.add_trace(go.Scatter(x=[CL_md], y=[300], mode="text",\
text="$C_{L,md}=\sqrt{\\frac{C_{D0}}{K}}$",\
textposition="bottom center", name="DontPrint",\
textfont=dict(color="mediumpurple")))
fig.add_trace(go.Scatter(x=[CL_mp], y=[200], mode="text",\
text="$C_{L,mp}=\sqrt{\\frac{3\,C_{D0}}{2\,K}}$",\
textposition="bottom center", name="DontPrint",\
textfont=dict(color="gold")))
# Overlay lines for the EAS
def CLtoEAS(CL):
V = np.sqrt(Ws/(.5 * rho_sl * S * CL)) /.5144444
return V
fig2.add_trace(go.Scatter(x=[CLtoEAS(CL_trcc), CLtoEAS(CL_trcc)], y=[400, 1500], name="DontPrint", mode="lines", line=dict(color="crimson")))
fig2.add_trace(go.Scatter(x=[CLtoEAS(CL_tucc), CLtoEAS(CL_tucc)], y=[400, 1500], name="DontPrint", mode="lines", line=dict(color="darkgreen")))
fig2.add_trace(go.Scatter(x=[CLtoEAS(CL_md), CLtoEAS(CL_md)], y=[400, 1500], name="DontPrint", mode="lines", line=dict(color="mediumpurple")))
fig2.add_trace(go.Scatter(x=[CLtoEAS(CL_mp), CLtoEAS(CL_mp)], y=[400, 1500], name="DontPrint", mode="lines", line=dict(color="gold")))
fig2.add_trace(go.Scatter(x=[CLtoEAS(CL_trcc)], y=[200], mode="text",\
text="$V_{C_{L,trcc}}$",\
textposition="bottom center", name="DontPrint",\
textfont=dict(color="crimson")))
fig2.add_trace(go.Scatter(x=[CLtoEAS(CL_tucc)], y=[300], mode="text",\
text="$V_{C_{L,tucc}}$",\
textposition="bottom center", name="DontPrint",\
textfont=dict(color="darkgreen")))
fig2.add_trace(go.Scatter(x=[CLtoEAS(CL_md)], y=[300], mode="text",\
text="$V_{C_{L,md}}$",\
textposition="bottom center", name="DontPrint",\
textfont=dict(color="mediumpurple")))
fig2.add_trace(go.Scatter(x=[CLtoEAS(CL_mp)], y=[200], mode="text",\
text="$V_{C_{L,mp}}$",\
textposition="bottom center", name="DontPrint",\
textfont=dict(color="gold")))
# Remove junk legend entries - this would be more efficient if I weren't lazy
for trace in fig['data']:
if (trace['name'] == "DontPrint") or (trace['name'] == "Annotation"): trace['showlegend'] = False
for trace in fig2['data']:
if (trace['name'] == "DontPrint") or (trace['name'] == "Annotation"): trace['showlegend'] = False
for trace in fig3['data']:
if (trace['name'] == "DontPrint") or (trace['name'] == "Annotation"): trace['showlegend'] = False
fig.update_layout(
title="Thrust Restricted and Unrestricted Ranges vs. Lift Coefficient for different starting altitudes",
xaxis_title="$C_L$",
yaxis_title="Range/km",
)
fig2.update_layout(
title="Thrust Restricted and Unrestricted Ranges vs. EAS for different starting altitudes",
xaxis_title="$V_{E}/\\text{kn}$",
yaxis_title="Range/km",
)
fig3.update_layout(
title="Thrust Restricted and Unrestricted Ranges vs. TAS for different starting altitudes",
xaxis_title="$V/\\text{kn}$",
yaxis_title="Range/km",
)
# Figure 1
fig.update_xaxes(range=[0, 1.5])
fig.update_yaxes(range=[0, 1500])
fig2.update_yaxes(range=[0, 1500])
fig2.update_xaxes(range=[0, 500])
fig3.update_yaxes(range=[0, 1500])
fig.show()
fig2.show()
fig3.show()
Notice that the maximum range is found at a considerably higher speed than both the minimum power and minimum drag speeds, for both types of cruise climb. The ratio between the two speeds and the minimum drag speed may be readily shown.
These ratios hold across altitudes, as you should expect.
BRE - Propeller Aircraft¶
The BRE for propeller aircraft is similar to that for jet aircraft, but SFC is used in place of TSFC - the SI units are \(\text{kg}/{\text W s}\).
The BRE for propeller aircraft is
where \(P\) is the power delivered to the aircraft from the propeller. With \(\eta\) as the propeller efficiency, the power delivered is function of the power required
so the BRE becomes
Assuming, as for the jet cruise-climb case, that \(\tfrac{C_L}{C_D}\), \(f\), and \(V\) remain constant, the equation above can be integrated from \(W_S\) to \(W_E\) to yield the endurance, \(E\):
Propeller Aircraft: Maximum Endurance¶
Equation (10) shows that for the maximum endurance for a propeller-driven aircraft, the quanity \(\frac{C_L}{V\,C_D}\) must be maximised, which is different to the jet aircraft case.
Clearly the maximum endurance is found at the minimum power condition, thus for maximum endurance a propeller-driven aircraft should fly at \(V_{mp}\).
Propeller Aircraft: Maximum Range¶
The increment in aircraft distance, \(\text{d}S\) when flown at velocity \(V\) is given by
Clearly the maximum endurance is found at the minimum drag condition, thus for maximum endurance a propeller-driven aircraft should fly at \(V_{md}\).
Range and Endurance Summary¶
The maximum range for propeller-driven aircraft is the same as for a glider - consider that the maximum range is given by the least resistance encountered in the longitudinal direction, enabling the aircraft to fly furthest, so this is the minimum drag speed.
The maximum endurance for propeller-driven aircraft is the same as for a glider - this is determined by the speed at which the most work is done with the least energy (most bang for buck), so this is the minimum power speed.
These are relatively easy to intuit because in a glider, there is no input power - and for a propeller-driven aircraft, the propulsor is directly providing power.
For a jet-driven aircraft, the engine provides thrust, and hence the power varies with forward speed. To get maximum range, using a cruise-climb method, the problem must be constrained somehow:
If the thrust is held constant, and altitude allowed to vary then the best \(C_L\) is \(\sqrt{\frac{C_{D0}}{2\,K}}\)
If the thrust is allowed to vary to maintain \(C_L\), then the best \(C_L\) is \(\sqrt{\frac{C_{D0}}{3\,K}}\)
The best range is found using the second method, starting at a greater altitude.
The starting altitude does not affect the range using the first method.
| Glider | Jet Aircraft | Propeller Aircraft | |
|---|---|---|---|
| Maximum Endurance | At $V_{mp}$ | At $V_{md}$ | At $V_{mp}$ |
| Maximum Range | At $V_{md}$ | $\gt V_{md}$ | At $V_{md}$ |
All of the cruise-climb scenarios are theoretical behaviour, and are reliant on the assumptions made within these models - furthermore, cruise-climb is typically not allowed by ATC. Rather, a series of stepped-climbs are made.
Nonetheless, the methods shown here allow a good estimate of range to be made - and afford the ability to look at the effect of design parameters on range and endurance.

